package org.demo;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageProducer;
import org.apache.activemq.ActiveMQMessageProducerSupport;

import javax.jms.*;

/**
 * 生产者
 *
 * @author yexi
 */
public class Producer {

    public static void main(String[] args) throws Exception {

        // 建立连接工厂(全部采用默认)
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

        // 获取连接
        Connection connection = connectionFactory.createConnection();

        // 开启连接
        connection.start();

        // 从连接中获取会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // 从会话中获取目的地
        Queue queue = session.createQueue("testQueue");

        // 从会话中创建消息生产者
        MessageProducer producer = session.createProducer(queue);
        /**
         * 设置消息的传递模式。JMS 规范定义了两种传递模式：持久化传递和非持久化传递。默认是持久化传递。
         * @see ActiveMQMessageProducer
         * @see ActiveMQMessageProducerSupport#defaultDeliveryMode
         */
        /*
            持久化传递(DeliveryMode.PERSISTENT): 表示消息在发送到消息队列之后会被持久化存储，即使消息系统崩溃或者重启，消息也不会丢失。
                                               因为持久化消息需要存储在磁盘上，所以持久化传递的性能比非持久化传递要差一些。
            非持久化传递(DeliveryMode.NON_PERSISTENT): 表示消息在发送到消息队列之后不会被持久化存储，如果消息系统崩溃或者重启，消息可能会丢失。
                                                     因为非持久化消息不需要存储在磁盘上，所以非持久化传递的性能比持久化传递要好一些。
         */
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        // 设置消息的优先级，默认是4。对 producer 的整体设置。
        producer.setPriority(Message.DEFAULT_PRIORITY);

        for (int i = 0; i < 10; i++) {
            String msg = "msg" + i;
            System.out.println("发送消息: " + msg);
            // 从会话中创建文本消息(也可以创建其它类型的消息体)
            TextMessage textMessage = session.createTextMessage(msg);
            if (i % 4 == 0) {
                // 设置消息的优先级。对本次会话的单次设置。
                textMessage.setJMSPriority(9);
            }
            session.commit();
            Thread.sleep(100);
            // 通过消息生产者发送消息到ActiveMQ
            producer.send(textMessage);
            // 可以通过重载方法分配每次的配置和发送的信息
//            producer.send(textMessage, DeliveryMode.PERSISTENT, 9, 1000 * 100);
        }

        // 关闭连接
        connection.close();
        System.out.println("系统关闭");
    }
}